<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /**
       * 解析日志行，将日志行分割成多个元素，并以数组形式返回。
       *
       * @param logLine 日志行字符串
       * @returns 返回一个包含日志行中所有元素的数组
       */
      function parseLogLine(logLine) {
        const result = [];
        let currentIndex = 0;
        let buffer = "";
        let inQuotes = false;
        // 循环遍历日志行中的每个字符
        while (currentIndex < logLine.length) {
          const char = logLine[currentIndex];
          if (char === "_") {
            // 如果遇到下划线且不在引号内，将buffer内容推入result并重置buffer。
            if (!inQuotes) {
              if (buffer) {
                // 检查buffer是否为空
                result.push(buffer);
                buffer = ""; // 重置buffer
              }
            } else {
              buffer += char; // 如果在引号内，则把下划线也加入buffer
            }
            // 如果遇到引号，切换inQuotes状态，
            // 并根据状态决定是否将buffer内容推入result并重置buffer。
          } else if (char === '"') {
            inQuotes = !inQuotes;
            if (!inQuotes && buffer) {
              // 检查buffer是否为空
              result.push(buffer);
              buffer = ""; // 重置buffer
            }
          } else {
            buffer += char; // 其他字符直接加入buffer
          }
          currentIndex++;
        }

        if (buffer) {
          // 处理日志行末尾的内容
          result.push(buffer);
        }

        return result;
      }

      // 测试示例数据
      const logLine = 'ab_c_"abc_abc"_abc_"dddd"';
      const parsed = parseLogLine(logLine);
      console.log(parsed); // 输出: ["ab", "c", "abc_abc", "abc", "dddd"]
    </script>
  </body>
</html>
